package es.unileon.aic.floatingpointalu.userInterface;

import java.awt.Toolkit;

import javax.swing.*;
import javax.swing.text.*;


/**
 * 
 * Clase que representa un campo de texto en el que solo se pueden introducir n&uacute;meros,
 * incluso en notacion exponencial
 * @author Abel Mayorga Gonz&aacute;lez
 * @author Beatriz Justel Garc&iacute;a
 * @version 2.0
 *
 */

public class JTextFieldFloat extends JTextField{
	
	/**
	 * Constructor de clase
	 */
	public JTextFieldFloat(){
		super();
		setHorizontalAlignment(SwingConstants.RIGHT);
	}
	
    /**
     * M&eacute;todo que devuelve el modelo de campo de texto personalizado
     */
    protected Document createDefaultModel(){
    	return new PlainDocumentFloat();
    }

    /**
     * Modelo de campo de texto que solo permite la introducci&oacute;n de d&iacute;gitos previa validaci&oacute;n
     * @author Abel Mayorga Gonz&aacute;lez
     * @author Beatriz Justel Garc&iacute;a
     * @version 2.0
     *
     */
    protected class PlainDocumentFloat extends PlainDocument{
		/**
		 * Inserta caracteres previa validaci&oacute;n
		 * @param offs - El desplazamiento inicial >=0
		 * @param str - El String a insertar
		 * @param a - Atributos del contenido insertado
		 * @throws BadLocationException La posici&oacute;n de inserci&oacute;n dada no es v&aacute;lida
		 */
		public void insertString(int offs, String str, AttributeSet a) throws BadLocationException{
		    char[] fuente = str.toCharArray();
		    char[] resultado = new char[fuente.length];
		    int j = 0;
		    boolean esCaracterValido = false;
		    
		    for (int i = 0; i < fuente.length; i++){
		    	switch (fuente[i]){
		    	case '0':
		    	case '1':
		    	case '2':
		    	case '3':
		    	case '4':
		    	case '5':
		    	case '6':
		    	case '7':
		    	case '8':
		    	case '9':
		    		//todos los digitos son validos
		    		esCaracterValido = true; 
		    		break;
		    	case '.':
		    		//se puede introducir un punto si no se ha introducido antes
		    		esCaracterValido = getText(0, getLength()).indexOf('.') == -1;
		    		break;
		    	case '-':
		    		//se puede introducir un '-' al principio o detras de la E
		    		esCaracterValido = getLength() == 0;
		    		esCaracterValido |= getText(0, getLength()).indexOf('E') == getLength()-1;
		    		esCaracterValido |= getText(0, getLength()).indexOf('e') == getLength()-1;
		    		break;
		    	case 'E':
		    	case 'e':
		    		//se puede introducir una 'E' si no hay una ya y si hay numeros antes
		    		esCaracterValido = (getText(0, getLength()).indexOf('E') == -1) && ((getLength() > 1) || (getText(0, getLength()).charAt(0) != '-'));
		    		esCaracterValido |= (getText(0, getLength()).indexOf('e') == -1) && ((getLength() > 1) || (getText(0, getLength()).charAt(0) != '-'));
		    		break;
		    	}
		    
				if (esCaracterValido) {
				    resultado[j++] = fuente[i];
				} else {
				    Toolkit.getDefaultToolkit().beep();
				}
		    }

		    super.insertString(offs, new String(resultado,0,j),a);
		}
    }
}
